#include "CTArrayTest.h"

CPPUNIT_TEST_SUITE_REGISTRATION(CTArrayTest);
using namespace CTLib;

void CTArrayTest::setUp()
{

}

void CTArrayTest::tearDown()
{

}

void CTArrayTest::testCheckIndex()
{
	typedef CTArray <int , 2> IntArray2;
	IntArray2 stArray2;
	stArray2.m_iUsedCount = 0;
	int iIndex = 0;
	iIndex = stArray2.CheckIndex(0);
	CPPUNIT_ASSERT(iIndex == 0);
	iIndex = stArray2.CheckIndex(1);
	CPPUNIT_ASSERT(iIndex == 1);
	iIndex = stArray2.CheckIndex(2);
	CPPUNIT_ASSERT(iIndex == 1);
	iIndex = stArray2.CheckIndex(3);
	CPPUNIT_ASSERT(iIndex == 1);

	stArray2.m_iUsedCount = -1;
	iIndex = stArray2.CheckIndex(0);
	CPPUNIT_ASSERT(iIndex == 0);
	iIndex = stArray2.CheckIndex(1);
	CPPUNIT_ASSERT(iIndex == 1);
	iIndex = stArray2.CheckIndex(2);
	CPPUNIT_ASSERT(iIndex == 1);
	iIndex = stArray2.CheckIndex(3);
	CPPUNIT_ASSERT(iIndex == 1);

	stArray2.m_iUsedCount = 1;
	iIndex = stArray2.CheckIndex(0);
	CPPUNIT_ASSERT(iIndex == 0);
	iIndex = stArray2.CheckIndex(1);
	CPPUNIT_ASSERT(iIndex == 1);
	iIndex = stArray2.CheckIndex(2);
	CPPUNIT_ASSERT(iIndex == 1);
	iIndex = stArray2.CheckIndex(3);
	CPPUNIT_ASSERT(iIndex == 1);

	stArray2.m_iUsedCount = 2;
	iIndex = stArray2.CheckIndex(0);
	CPPUNIT_ASSERT(iIndex == 0);
	iIndex = stArray2.CheckIndex(1);
	CPPUNIT_ASSERT(iIndex == 1);
	iIndex = stArray2.CheckIndex(2);
	CPPUNIT_ASSERT(iIndex == 1);
	iIndex = stArray2.CheckIndex(3);
	CPPUNIT_ASSERT(iIndex == 1);

	stArray2.m_iUsedCount = 3;
	iIndex = stArray2.CheckIndex(0);
	CPPUNIT_ASSERT(iIndex == 0);
	iIndex = stArray2.CheckIndex(1);
	CPPUNIT_ASSERT(iIndex == 1);
	iIndex = stArray2.CheckIndex(2);
	CPPUNIT_ASSERT(iIndex == 1);
	iIndex = stArray2.CheckIndex(3);
	CPPUNIT_ASSERT(iIndex == 1);

	typedef  CTArray<int,1> IntArray1;
	IntArray1 stArray1;
	stArray1.m_iUsedCount = 1;
	iIndex = stArray1.CheckIndex(0);
	CPPUNIT_ASSERT(iIndex == 0);
	iIndex = stArray1.CheckIndex(1);
	CPPUNIT_ASSERT(iIndex == 0);
	iIndex = stArray1.CheckIndex(2);
	CPPUNIT_ASSERT(iIndex == 0);
	iIndex = stArray1.CheckIndex(3);
	CPPUNIT_ASSERT(iIndex == 0);

	typedef CTArray<int,0> IntArray0;
	IntArray0 stArray0;
	stArray0.m_iUsedCount = 0;

}

void CTArrayTest::testAddOneItem()
{
	typedef CTArray<int, 2> IntArray2;
	IntArray2 stArray2;
	int iRet = 0;
	CPPUNIT_ASSERT(stArray2.Size() == 0);
	int iNum = 0;
	iRet = stArray2.AddOneItem(iNum);
	CPPUNIT_ASSERT(iRet == 0);
	CPPUNIT_ASSERT(stArray2[0] == 0);
	CPPUNIT_ASSERT(stArray2.Size() == 1);

	iNum = 1;
	iRet = stArray2.AddOneItem(iNum);
	CPPUNIT_ASSERT(iRet == 1);
	CPPUNIT_ASSERT(stArray2[0] == 0);
	CPPUNIT_ASSERT(stArray2[1] == 1);
	CPPUNIT_ASSERT(stArray2.Size() == 2);

	iNum = 2;
	iRet = stArray2.AddOneItem(iNum);
	CPPUNIT_ASSERT(iRet == -1);
	CPPUNIT_ASSERT(stArray2[1] == 1);

	CPPUNIT_ASSERT(stArray2.Size() == 2);

}

void CTArrayTest::testDelOneItem()
{
	typedef CTArray<int, 2> IntArray2;
	IntArray2 stArray2;
	int iRet = 0;
	int iNum = 0;
	iRet = stArray2.AddOneItem(iNum);
	CPPUNIT_ASSERT(iRet == 0);
	CPPUNIT_ASSERT(stArray2[0] == 0);

	iNum = 1;
	iRet = stArray2.AddOneItem(iNum);
	CPPUNIT_ASSERT(iRet == 1);
	CPPUNIT_ASSERT(stArray2[0] == 0);
	CPPUNIT_ASSERT(stArray2[1] == 1);

	iNum = 2;
	iRet = stArray2.AddOneItem(iNum);
	CPPUNIT_ASSERT(iRet == -1);
	CPPUNIT_ASSERT(stArray2[1] == 1);

	iNum = 3;
	iRet = stArray2.DelOneItem(iNum);
	CPPUNIT_ASSERT(iRet == -1);


	iRet = stArray2.DelOneItem(1);
	CPPUNIT_ASSERT(iRet == 1);
	CPPUNIT_ASSERT(stArray2.Size() == 1);

	iRet = stArray2.DelOneItem(1);
	CPPUNIT_ASSERT(stArray2.Size() == 1);

	iRet = stArray2.DelOneItem(0);
	CPPUNIT_ASSERT(stArray2.Size() == 0);

	CTArray<int,3> stArray3;
	iNum = 10;
	stArray3.AddOneItem(iNum);
	iNum = 11;
	stArray3.AddOneItem(iNum);
	iNum = 12;
	stArray3.AddOneItem(iNum);

	stArray3.DelOneItem(0);
	CPPUNIT_ASSERT(stArray3[0] == 12);

}

void CTArrayTest::testShiftDelOneItem()
{
	CTArray<int,5> stArray5;
	int i = 0;
	for (i = 1; i <= 5; ++i)
	{
		stArray5.AddOneItem(i);
	}
	
	int iRet = stArray5.ShiftDelOneItem(5);
	CPPUNIT_ASSERT(iRet == -1);
	
	iRet = stArray5.ShiftDelOneItem(0);
	CPPUNIT_ASSERT(iRet == 0);
	
	for (i = 0; i < 4; ++i)
	{
		CPPUNIT_ASSERT(stArray5[i] == i + 2);
	}

}

void CTArrayTest::testOperatorAssign()
{

}

void CTArrayTest::testOperatorAddAssign()
{

}

void CTArrayTest::testOperatorMinusAssign()
{

}
